注册

ARM9与远程web服务器交互之灯控实验
首页 > 嵌入式开发 > Linux嵌入式    作者:RainFly   2016年8月24日 19:52 星期三   热度:9540°   字号:   评论:11    
时间:2016-8-24 19:52   热度:9540°  评论:11 条 

     摘要:网上又不少历程关于ARM平台的web实验,基本上都是在内网完成的,本地搭建好web服务器,而ARM平台的web服务器不支持内网穿透,继而无法从外网访问控制,或许你有公网IP可以进行端口映射访问,不过本次实验目的不在此,本次主要完成ARM9开发板通过HTTP协议与Apache服务器数据交互。如有错误或者建议,敬请批评指正。

捕获.PNG

实验设备:  EasyARM i.mx283(周立功ARM9板子)  linux2.6.35系统

                   ECS云服务器 具备公网IP  120.27.4.152 (ubunut14.04系统 Apache2+PHP5+MySQL)  配置方法 —>点此

                   交叉编译工具 arm-none-linux-gnueabi-gcc 

                   宿主机 Ubuntu14.04 

语言需求:C ,HTML,JavaScript,jquery,PHP,MySQL,shell脚本(了解)   


实验原理: 

                通过ARM开发板不断向web服务器发送POST/GET请求,来获得服务器返回的数据,数据中携带了light0的value值,通过C对字符串分析获得服务器数据库类light0的value值,来更改P2.4引脚的电平高低,从而达到下位机控灯,至于web页面通过ajax GET方式提交至相应PHP文件,从而修改数据库类light0 的value值。完成web服务器控灯实验


开发板方面不做过多介绍,周立功官网上面提供了手册, 提一下重要操作就是关于灯控的高低点平,/sys/class/gpio/在这个类下面(GPIO驱动已经提供了,先拿来用) 我们按照手册上面所提供的数据建立好一个 68 P2.4引脚的虚拟控制文件, (linux下面一切皆为文件),生成了引脚电平控制文件 /sys/devices/virtual/gpio/gpio68/value   通过echo 1(0) > value 可以更改P2.4引脚高低电平。


C语言文件

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<arpa/inet.h>  
#include<string.h>
#include<fcntl.h>
#include<unistd.h>

#define IP_ADDR "120.27.4.152"  
#define ARCHIVE "/data/light.php" 
#define PORT        80  

#define DEV_PATH "/sys/devices/virtual/gpio/gpio68/value"
#define HIGH    "1"
#define LOW     "0"
  
int main(int argc, char *argv[]){  
   
   int fd;
   int sockfd;  
   int len;  
   struct sockaddr_in address;  
   int result;  
   char data[1024];  
   memset(data, 'a', 1024);  
   char httpstring[2048];  
   sprintf(httpstring,"POST /%s  HTTP/1.1\r\n"  
         "Host: %s\r\n"  
         "Content-Length: %d\r\n"  
         "Connection:Close\r\n\r\n"  
         "Content-Type: Application/octet-stream\r\n\r\n"  
         "$name=rainfly"
		 "%s",  
         ARCHIVE, IP_ADDR, strlen(data), data);  
   char ch;  
   sockfd = socket(AF_INET, SOCK_STREAM, 0);  
   address.sin_family = AF_INET;  
   address.sin_addr.s_addr = inet_addr(IP_ADDR);  
   address.sin_port = htons(PORT);  
   len = sizeof(address);  
   result = connect(sockfd,(struct sockaddr *)&address,len);  
   if(result == -1)  
   {  
      perror("oops: client");  
	  return 1;  
   } 
   
   write(sockfd,httpstring,strlen(httpstring));  
   while(read(sockfd,&ch,1)) 
   {  
//     printf("%c", ch);
   }
   
//   printf("%c",ch);
   int a= ch-48;//ASCII change
//   printf("%d",a);
   if(a==1)
   {
	 printf("open");
        fd=open(DEV_PATH,O_WRONLY);
	if(fd<0){printf("open value fail!");}
	write(fd,HIGH,strlen(HIGH));
	close(fd);
   }
   else{
        printf("close");	
        fd=open(DEV_PATH,O_WRONLY);
	if(fd<0){printf("open value fail!");}
	write(fd,LOW,strlen(LOW));
	close(fd);
   }
   
   close(sockfd);  
   printf("\n"); 
   return 0;  
}

 注意: 不管data的数据内容是什么上面我发送的是1024个'a' 虽然这毫无用出,关于这个POST GET提交方式,在本次实验都是可以的携带的data数据并没有实质性作用,(PS:或许在以后的实验中,需要用到数据提交给服务器)。这里仅实现对服务器发送POST请求,然后通过服务器判断是否携带了数据参数来进行输出,或者修改数据库


核心PHP脚本。
/data/light.php

<?PHP
$lnk = mysql_connect("127.0.0.1:3306","root","Dyf1314520");
if (!$lnk){
  die('Could not connect: ' . mysql_error());
}
if(mysql_query("CREATE DATABASE smarthome",$lnk)){
	 mysql_select_db('smarthome', $lnk);
	 $sql = "CREATE TABLE light    
			(
			LightName varchar(7),
			value int
			)";
	mysql_query($sql,$lnk);//创建表结构
	mysql_query("INSERT INTO light (LightName, value) 
	     VALUES ('light0', '1')");  //插入新表项
}



mysql_select_db('smarthome', $lnk); //选中数据库

//带参数访问更改 数据库中 light0的值
if (isset($_GET['light0'])) {
 	$light0=$_GET['light0'];
	mysql_query("UPDATE light SET value = ".$light0." WHERE LightName = 'light0'");
	echo $light0;
}
else {  //如果直接访问就获得数据库数据
	$result = mysql_query("SELECT * FROM light WHERE LightName='light0'");
//mysql系的函数中都是逐行读取的,即第一次mysql_fetch_array得到第一行,第二次得到第二行
//实际上一个灯只需要第一行
while($row = mysql_fetch_array($result))
  {
  echo $row['value'];
  }
}

?>
该文件既处理Ajax提交过来的GET请求,将数据库中light0 的value值进行修改,也应答下位机POST请求,将value值通过HTTP协议发送给下位机。 


捕获1.PNG

  home_light.php 页面AJAX提交源码


 		//去除str的前后空格
		function trim(str){   
    return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,'');   
		} 

		var light0_temp=1;
		var light0;
 		$(document).ready(function(){ 		 
	    $("#light0").click(function(){
	    		 
	    		light0_temp = ~ light0_temp;
	    		if(light0_temp!='1'){light0=0;}
	    		else {light0=1;} //js判断
	    			
	        var url = '/data/light.php'; // 取Form中要提交的链接
	        var param = {}; // 组装发送参数
	        param['light0']  = light0;
	      $.get(url, param, function(dom) { 
	      	  dom=trim(dom);
		      	if (dom=='1') {
		    
		      		$('#light0_img').attr("src","img/light_on.png");        
		      	}
		      	else {
		      	
		      		$('#light0_img').attr("src","img/light_off.png");    
		      	}
	      	
	      	}) ;  // 发送并显示返回内容
	    });
		})
源码在下方下载,其余功能正在开发中.....


实验文档来源:360  | 大小:0MB  | 提取密码:f579 | 解压密码:www.rainfly.cn
已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!
  您阅读这篇文章共花了:  
捐赠支持:如果觉得这篇文章对您有帮助,请 "扫一扫"鼓励作者!
二维码加载中...
本文作者:RainFly      文章标题: ARM9与远程web服务器交互之灯控实验
本文地址:http://www.rainfly.cn/?post=263
版权声明:若无注明,本文皆为“雨夜轩”原创,转载请保留文章出处。

已有11条吐槽

宁国房产网  Google Chrome 55.0.2883.87 Google Chrome 55.0.2883.87 Windows 7 Windows 7  2017-11-14 22:07 #8楼
辛苦了,谢谢分享!
卡森卫星城  Firefox 51.0 Firefox 51.0 Windows 7 Windows 7  2017-02-27 13:26 #7楼
厉害了我的歌
烟雨平生  Google Chrome 54.0.2840.99 Google Chrome 54.0.2840.99 Windows 10 Windows 10  2016-11-29 21:05 #6楼
厉害
摩天之星  Firefox 49.0 Firefox 49.0 Windows 7 Windows 7  2016-11-14 12:30 #5楼
大神啊,膜拜下
任务易  Firefox 49.0 Firefox 49.0 Windows 7 Windows 7  2016-10-21 14:19 #4楼
虽然看不太懂,还是进来点个赞,支持博主
怎样炒股 Firefox 47.0 Firefox 47.0 Windows 10 Windows 10  2016-10-30 00:01
@任务易:谢谢分享。。。
essaypinglun  Firefox 40.0 Firefox 40.0 Windows 10 Windows 10  2016-10-10 20:13 地板
感谢楼主的分享
海云博客  Google Chrome 45.0.2454.101 Google Chrome 45.0.2454.101 Windows 7 Windows 7  2016-10-10 14:51 板凳
撒花撒花撒花撒花
购物街  Google Chrome 49.0.2623.75 Google Chrome 49.0.2623.75 Windows 7 Windows 7  2016-08-31 15:49 沙发
很不错的分享
外贸跨境电商 Firefox 47.0 Firefox 47.0 Windows 10 Windows 10  2016-09-15 10:39
@购物街:这个文章必须顶。。
外贸跨境电商 Firefox 47.0 Firefox 47.0 Windows 10 Windows 10  2016-09-21 02:08
@购物街:顶。。一定得顶。。。。

QQ游客评论

返回顶部    首页    捐赠支持    手气不错    友情链接    关于我们    站长工具    站长介绍    手机版本    后台登陆   
版权所有:雨夜轩    站长:RainFly    特别鸣谢   文章归档   皖ICP备15003600号-1   百度统计
Copyright©2015 雨夜轩 Powered by emlog强力驱动 七牛CDN全球加速 360站长联盟安全认证 中国博客联盟荣誉成员 可信赖网站 站点地图   
页面加载耗时:0.079秒 数据库查询次数:33次
背景设置